 package com.example.shutdown_v1.entity;

/**
 * 传感器型号枚举
 * 用于区分不同型号的传感器设备
 */
public enum SensorModel {
    /**
     * IM600陀螺仪传感器
     * - 数据包长度: 73字节
     * - 数据格式: 订阅标识+时间戳+多种传感器数据
     * - 支持欧拉角、加速度、角速度等
     * - 类型: 6轴传感器(加速度+角速度)
     * - 特点: Z轴会累计误差,使用时间越长、转动角度越大,误差越大
     */
    IM600("IM600", "IM600陀螺仪传感器", 73, 6),
    
    /**
     * MD9930智能姿态模块
     * - 数据包长度: 18字节(基础) 或 22字节(含时钟Ticks)
     * - 数据格式: 加速度(6字节) + 角速度(6字节) + 计数器(2字节) + 时钟(4字节,可选)
     * - 不支持欧拉角,需要通过加速度和角速度计算
     * - 类型: 6轴传感器(加速度+角速度)
     * - 特点: Z轴会累计误差,使用时间越长、转动角度越大,误差越大
     */
    MD9930("MD9930", "MD9930智能姿态模块", 18, 6),
    
    /**
     * WT9011DCL-BT50蓝牙姿态传感器
     * - 数据包长度: 20字节(BLE协议 0x61)
     * - 数据格式: 0x55 0x61 + 加速度(6字节) + 角速度(6字节) + 欧拉角(6字节)
     * - 直接提供欧拉角(Roll/Pitch/Yaw),无需计算
     * - 类型: 9轴传感器(加速度+角速度+磁场)
     * - 特点: 有磁场校准,会不断累积,相对稳定
     */
    WT9011("WT9011", "WT9011DCL-BT50蓝牙姿态传感器", 20, 9),
    
    /**
     * 未知型号
     */
    UNKNOWN("UNKNOWN", "未知型号", 0, 0);
    
    private final String code;
    private final String description;
    private final int dataLength;
    private final int axisCount; // 轴数: 6轴或9轴
    
    SensorModel(String code, String description, int dataLength, int axisCount) {
        this.code = code;
        this.description = description;
        this.dataLength = dataLength;
        this.axisCount = axisCount;
    }
    
    public String getCode() {
        return code;
    }
    
    public String getDescription() {
        return description;
    }
    
    public int getDataLength() {
        return dataLength;
    }
    
    public int getAxisCount() {
        return axisCount;
    }
    
    /**
     * 判断是否为6轴传感器
     * 6轴传感器的Z轴会累计误差,需要更宽松的阈值
     */
    public boolean is6Axis() {
        return axisCount == 6;
    }
    
    /**
     * 判断是否为9轴传感器
     * 9轴传感器有磁场校准,相对稳定,可以使用更严格的阈值
     */
    public boolean is9Axis() {
        return axisCount == 9;
    }
    
    /**
     * 根据MAC地址识别传感器型号
     * 规则: 所有传感器统一识别为IM600
     * 历史MAC地址:
     * - 2EADE3511DD8, 32BC1E1E24E1, B5B5E671875F -> IM600
     * - 546C0EB85138 -> IM600 (原MD9930)
     * - CA7B6FE4D918 -> IM600 (原WT9011)
     * - 其他 -> IM600
     */
    public static SensorModel fromMac(String mac) {
        if (mac == null || mac.isEmpty()) {
            return IM600;
        }
        
        // 所有传感器统一返回IM600
        return IM600;
    }
    
    /**
     * 根据代码获取型号
     * 统一返回IM600
     */
    public static SensorModel fromCode(String code) {
        if (code == null) {
            return IM600;
        }
        
        for (SensorModel model : values()) {
            if (model.code.equalsIgnoreCase(code)) {
                return model;
            }
        }
        
        // 未知型号也默认返回IM600
        return IM600;
    }
}

